<?php require('../globals.inc'); $mikron->Page->StartBody(); ?>
<?php require_once('menu.inc'); ?>
<h1>Файловый менеджер</h1>

<?php

 function myErrorHandler($errno, $errstr, $errfile, $errline)
 {
    switch($errno)
    {
      case -999999: print "<DIV class='errortext'>Файл не найден.</DIV>"; break;
      default: print "<DIV class='errortext'><nobr>(№ ошибки - $errno) $errstr (ошибка на строке ".$errline.")</nobr></DIV>";
    }
 }

 // set_error_handler('myErrorHandler');

 //инициализация переменных
 if(isset($HTTP_SERVER_VARS['HTTP_HOST'])){$SERVERHOST = $HTTP_SERVER_VARS['HTTP_HOST'];}
 if(!isset($SERVERHOST)){if(isset($_SERVER['HTTP_HOST'])){$SERVERHOST = $_SERVER['HTTP_HOST'];}}
 DEFINE('DOCUMENTROOT', $_SERVER['DOCUMENT_ROOT']);
 if(isset($_SERVER['SCRIPT_NAME'])){define('THIS_FILE_NAME',$_SERVER['SCRIPT_NAME']);}else{define('THIS_FILE_NAME', "fs.php");}

 $view_path = "";
 if (isset($_GET['viewdir'])) {$view_path = $_GET['viewdir'];}
 if (isset($_POST['viewdir'])) {$view_path = $_POST['viewdir'];}
 if($view_path==""){$view_path=DOCUMENTROOT;}

 //убираем последний слеш в конце пути
 if(strrpos($view_path,"/") == strlen($view_path)-1){$view_path = substr($view_path,0,strlen($view_path)-1);}

 securepath($view_path);

 //chdir($view_path);
 //$view_path = getcwd();
 //if(strlen($view_path)<strlen(DOCUMENTROOT)){$view_path=DOCUMENTROOT;}
 //chdir($view_path);
 //$view_path = getcwd();
 $url = "http://".$SERVERHOST.substr($view_path,strlen(DOCUMENTROOT))."/";
 $parent = get_parent_directory($view_path);

 securepath($view_path);

 function securepath($path)
 {
   $bad = 0;
   if(strpos($path,"..") === false){}else{$bad=1;}
   if(strlen($path)<strlen(DOCUMENTROOT)){$bad=1;}
   if($bad==1)
   {
     print "<DIV class='errortext'>Недопустимый путь «";
     print $path;
     print "»</DIV>Перейти в <a href='";
     print THIS_FILE_NAME;
     print "?viewdir=";
     print DOCUMENTROOT;
     print "'>корневой каталог</a>";
     include("footer.php");
     exit;
   }
 }


//закачка файла
if(isset($_POST['MAX_FILE_SIZE'])){

  error_reporting(0);
  ini_set('max_input_time','1800');
  $errmsg = '';

  DEFINE('UPLOAD_DIR',$view_path."/"); //Папка с файлами
  DEFINE('ALLOW_EXT', 'jpg|gif|png|rar|zip|txt|html|htm|php|7z|jpeg|pdf|chm|doc|xls|mp3|wav|swf|avi|mpg|mpeg');  //Список разрешенных расширений через '|'

  function return_bytes($val){
          $val  = trim($val);
          $last = strtolower($val{strlen($val)-1});
          switch($last)
          {
                  case 'g':$val *= 1024;
                  case 'm':$val *= 1024;
                  case 'k':$val *= 1024;
          }
          return $val;
  }

  function pr_callback($str){
          GLOBAL $CCV;
          $str = substr($str[0],1,strlen($str[0])-2);
          if (!isset($CCV[$str])) return '!#Undifined Index#!';
          return $CCV[$str];
  }

  /*function output_tmpl($path){
          if (!file_exists($path)) exit('Template Not Found');
          $FC =  file_get_contents($path);
          $FC = preg_replace_callback('|\{[A-Z_]{4,12}\}|i','pr_callback',$FC);
          echo $FC;
          unset($FC);
  }*/

  function uploadfile(&$fexp)
  {
    $count = 0;
    reset($fexp['name']);
    foreach ($fexp['error'] as $value) {
      $err = $fexp['error'][$count];
      $name = $fexp['name'][$count];
      $size = $fexp['size'][$count];
      $temp = $fexp['tmp_name'][$count];
      $type = $fexp['type'][$count];
      if ($err !== UPLOAD_ERR_OK)
      {
        switch($err)
        {
          case UPLOAD_ERR_INI_SIZE:
          case UPLOAD_ERR_FORM_SIZE: print "Слишком большой файл ($name)<br />\r\n"; break;
          case UPLOAD_ERR_PARTIAL: print "Ошибка загрузки ($name)<br />\r\n"; break;
          //case UPLOAD_ERR_NO_FILE: print "Нет файла <br />\r\n"; break;
        }
        return FALSE;
      }
      if(!preg_match("/".ALLOW_EXT."$/i",$name)){print "Нельзя загружать файлы этого типа ($name)<br />\r\n"; return FALSE;}
      if(@move_uploaded_file($temp,UPLOAD_DIR.$name) == FALSE){print "Ошибка сервера. (".UPLOAD_DIR."$name)<br />\r\n"; return FALSE;}
      print "<li>Файл (".$name.") успешно загружен.</li>";
      //return TRUE;
      $count++;
    }
  }

  if (sizeof($_FILES) > 0) {print "<div class='list' s tyle='padding:8px;'>";array_map('uploadfile',$_FILES);print "</DIV>";}

  //min(ini_get('upload_max_filesize'),ini_get('post_max_size'));

}

//файловые операции
if(isset($_POST['viewdir']))
{
  $rootdir = $_POST['viewdir'];
  if(isset($_POST['delete']))     {  if(isset($_POST['folder']) || isset($_POST['file'])) {print "Следующие папки/файлы были удалены:<ol>";}
                                     if(isset($_POST['folder']))
                                     {
                                       $ar = $_POST['folder'];
                                       
                                       foreach($ar as $k)
                                       {
                                         $path = $rootdir."/".$k;
                                         rm_tree_dir($path);
                                       }
                                     }
                                     if(isset($_POST['file']))
                                     {
                                       $ar = $_POST['file'];
                                       foreach($ar as $k)
                                       {
                                         $path = $rootdir."/".$k;
                                         rm_tree_dir($path);
                                       }
                                     }
                                     if(isset($_POST['folder']) || isset($_POST['file'])) {print "</ol>";}
                                  }

  elseif(isset($_POST['rename'])) {print "rename";}
  elseif(isset($_POST['copy']))   {print "copy";}
  elseif(isset($_POST['move']))   {print "move";}
  elseif(isset($_POST['mkfile'])) {print "mkfile";}
  elseif(isset($_POST['mkdir']))  {
                                    if(isset($_POST['createname']))
                                    {
                                     $createname = $_POST['createname'];
                                     $path = $rootdir."/".$createname;
                                     securepath($path);
                                     if(mkdir($path,0770))  
			             {
                                        header("Location: ".THIS_FILE_NAME."?viewdir=".$rootdir."&message=Папка «<b>$path</b>» успешно создана.");
                                        exit;
                                        //print "<DIV>Папка <b>$path</b> успешно создана.</DIV>";
                                      } //else{print "<div class=errortext>Не удалось создать папку «<b>$path</b>»</div>";}
                                    }
                                  }
}

if(isset($_GET['message']))  {print "<DIV><p>".$_GET['message']."</p></DIV>";}

//удаление папки со всем содержимым
function rm_tree_dir($folder){
        umask(0000);
        if (is_dir($folder)){
           //chmod($folder,0777);
           securepath($folder);
           $handle = opendir($folder);
           while ($subfile = readdir($handle)){
             if ($subfile == '.' or $subfile == '..') continue;
             if (is_file($subfile))
               {
                 print "<li>Удаление файла ".$folder."/".$subfile;
                 //chmod($folder."/".$subfile,0666);
                 securepath($folder."/".$subfile);
                 unlink($folder."/".$subfile);
               }
             else rm_tree_dir($folder."/".$subfile);
           }
           closedir($handle);
           print "<li>Удаление папки ".$folder;
           //chmod($folder,0777);
           securepath($folder);
           rmdir($folder);
         }
         else {
           print "<li>Удаление файла ".$folder;
           //chmod($folder,0666);
           securepath($folder);
           unlink($folder);
         }
}

//Определение разрешений
function display_perms( $mode ) { 
	if(($mode & 0xC000) === 0xC000) // Сокет домена 
	$type = "s"; 
	elseif(($mode & 0x4000) === 0x4000) // Директория 
	$type = "d"; 
	elseif(($mode & 0xA000) === 0xA000) // Символическая ссылка 
	$type = "l"; 
	elseif(($mode & 0x8000) === 0x8000) // Регулярный файл 
	$type = "-"; 
	elseif(($mode & 0x6000) === 0x6000) // Специальный файл БЛОК
	$type = "b"; 
	elseif(($mode & 0x2000) === 0x2000) // Специальный файл Символ
	$type = "c"; 
	elseif(($mode & 0x1000) === 0x1000) // PIPE
	$type = "p"; 
	else // Неизвестный 
	$type = "?";

	$owner['read'] = ($mode & 00400) ? "r" : "-";
	$owner['write'] = ($mode & 00200) ? "w" : "-";
	$owner['execute'] = ($mode & 00100) ? "x" : "-";

	$group['read'] = ($mode & 00040) ? "r" : "-";
	$group['write'] = ($mode & 00020) ? "w" : "-";
	$group['execute'] = ($mode & 00010) ? "x" : "-";

	$world['read'] = ($mode & 00004) ? "r" : "-";
	$world['write'] = ($mode & 00002) ? "w" : "-";
	$world['execute'] = ($mode & 00001) ? "x" : "-";

	if( $mode & 0x800 ) 
	$owner['execute'] = ($owner[execute]=="x") ? "s" : "S"; 
	if( $mode & 0x400 ) 
	$group['execute'] = ($group[execute]=="x") ? "s" : "S"; 
	if( $mode & 0x200 ) 
	$world['execute'] = ($world[execute]=="x") ? "t" : "T"; 
	$return = $type.$owner['read'].$owner['write'].$owner['execute'].$group['read'].$group['write'].$group['execute'].$world['read'].$world['write'].$world['execute'];
	return $return;
}


//Определение разрешений
function display_perms_three($mode) { 
  $a=0;
  $b=0;
  $c=0;
  $p=0;
  if(($mode & 00400)){$a+=4;}
  if(($mode & 00200)){$a+=2;}
  if(($mode & 00100)){$a+=1;}
  if(($mode & 00040)){$b+=4;}
  if(($mode & 00020)){$b+=2;}
  if(($mode & 00010)){$b+=1;}
  if(($mode & 00004)){$c+=4;}
  if(($mode & 00002)){$c+=2;}
  if(($mode & 00001)){$c+=1;}
  return $a.$b.$c;
}

function get_parent_directory($file)
{
 return substr($file,0,strlen($file)-strlen(basename($file)));
}

?>

<p>
    <?php
     if($view_path==DOCUMENTROOT)
       {
         print "<b>Путь:</b> ".$view_path;
       }
     else
       {
         print "<b>Путь:</b> <a href='".THIS_FILE_NAME."?viewdir=$parent'>".$parent."</a>".basename($view_path);
       }
     print "<br /><b>Права:</b> ".display_perms_three(fileperms($view_path))." ".display_perms(fileperms($view_path));
    ?>
</p>

<?php
 //сканирование директорий
 $d = dir($view_path);
 if(!is_object($d))
 {
     ?><div class="mikroncms_error">Не доступа к объекту.</div><?php
     $mikron->Page->EndBody();
     exit;
 }
?>
<FORM name="filesystem" action="<?php print THIS_FILE_NAME; ?>" method="post">
    <input type="hidden" name="viewdir" value="<?php print $view_path; ?>">
    <TABLE class='table3' w idth=100% border=0 cellspacing=0 cellpadding=0>
    <thead><th class='fmCap'>&nbsp;<th class='fmCap'>Имя<th class='fmCap'>Размер<th class='fmCap'>Права<th class='fmCap'>Действия
    </thead>
<?php

 $folders = 0;
 $files =0;

 //сканирование директорий
 $d = dir($view_path);

 while($entry = $d->read())
 {
   if($entry != '.' && $entry != '..')
   {
     $path = $view_path.'/'.$entry;
     $perm = fileperms($path);
     if(($perm & 0x4000) === 0x4000)
     {
       print "\n<TR class='fmLine' bg color='#E0E0FF'>";
       print "<TD class='fmData'><input type='checkbox' name='folder[]' value='$entry'>";
       print "<TD class='fmData' width=100%><a href='".THIS_FILE_NAME."?viewdir=$view_path/$entry'>".$entry."</a>";
       print "<TD class='fmData'>&nbsp;";
       //print "<TD class='fmData'>".display_perms($perm);
       print "<TD class='fmData'><nobr>".display_perms_three($perm)." ".display_perms($perm)."</nobr>";
       print "<TD class='fmData'>&nbsp;";
       $folders++;
     }
   }
 }
 $d->close();

 //сканирование файлов
 $d = dir($view_path);

 $size = 0;
 while($entry=$d->read())
 {
   if($entry != '.' && $entry != '..')
   {
     $path = $view_path."/".$entry;
     $perm = fileperms($path);
     $permis = stat($path);
     if(($perm & 0x8000) === 0x8000)
     {
       print "\n<TR class='fmLine'>";
       print "<TD class='fmData'><input type='checkbox' name='file[]' value='$entry'>";
       print "<TD class='fmData' width=100%><a href='$url$entry' target='_blank'>".$entry."</a>";
       print "<TD class='fmData'>"; $size += filesize($path); print filesize($path);
       print "<TD class='fmData'><nobr>".display_perms_three($perm)." ".display_perms($perm)."</nobr>";
       print "<TD class='fmData'><a target='_blank' href='$url$entry'>Показать</a>";
       $files++;
     }
   }
 }
 $d->close();

?>

    </TABLE>
    <input type="hidden" name="viewdir" value="<?php print $view_path; ?>">
    <input type=submit name="delete" value="Удалить">
    <?php /* input type=submit name="rename" value="Переименовать">
    <input type=submit name="copy" value="Копировать">
    <input type=submit name="move" value="Перенести" */ ?>
</form>

<p>
    <FORM name="filesystem" action="<?php print THIS_FILE_NAME; ?>" method="post">
    <input type="hidden" name="viewdir" value="<?php print $view_path; ?>">
    <fieldset><legend>Создание папки</legend>
        Имя: <input name="createname">
        <!-- input type=submit name="mkfile" value="Создать файл" -->
        <input type="submit" name="mkdir" value="Создать папку">
    </fieldset>
    </FORM>
</p>

<form enctype="multipart/form-data" action="<?php print THIS_FILE_NAME; ?>" method='post'>
<input type="hidden" name="viewdir" value="<?php print $view_path; ?>">
<fieldset><legend>Загрузить файл</legend>
   <input type='hidden' name='MAX_FILE_SIZE' value='2000000' />
   <DIV id="filelist" class="list">
       Файл: <input name='userfile[]' type='file'><br />
       Файл: <input name='userfile[]' type='file'><br />
       Файл: <input name='userfile[]' type='file'><br />
       Файл: <input name='userfile[]' type='file'><br />
       Файл: <input name='userfile[]' type='file'><br />
   <DIV>

   <?php /*button onclick="addfile();">Еще</button>
   <script>
    function addfile()
    {
      filelist.document.writeln( "Файл: <input name='userfile' type='file'>");
    }
   </script */ ?>

</fieldset>
   <input type='submit' value="Загрузить">
</form>

<br />
 <b>Размер файлов в папке:</b> <?php print $size; ?> байт
 <br /><b>Папок: </b><?php print $folders; ?>
 <br /><b>Файлов: </b><?php print $files; ?>

<?php $mikron->Page->EndBody(); ?>